package frsf.cidisi.exercise.arqueologic.situationCalculus;

import java.util.ArrayList;

import Clases.Cofre;
import Clases.Mundo;

import frsf.cidisi.faia.agent.Agent;
import frsf.cidisi.faia.agent.situationcalculus.SituationCalculusPerception;
import frsf.cidisi.faia.environment.Environment;

public class ArqueologicAgentPerception extends SituationCalculusPerception {
	
	public static int UNKNOWN_PERCEPTION = -1; 
    public static int COFRE_VACIO = 0;
    public static int COFRE_LLENO = 1;
  	/*
	private int vercofre;
	private int usarsatelite;*/
	
	private String posicion;
	private String destino;
	Mundo mundo;
	Cofre cofre;

    public ArqueologicAgentPerception() {
        super();

		//TODO: Complete Method
    }
    public ArqueologicAgentPerception(Agent agent, Environment environment) {
		super(agent, environment);
	}

    @Override
    public void initPerception(Agent agent, Environment environment) {
    	ArqueologicAgent ag = (ArqueologicAgent) agent;
    	ArqueologicEnvironment env = (ArqueologicEnvironment) environment;
        ArqueologicEnvironmentState environmentState = env.getEnvironmentState();
        /*
        posicion = environmentState.getposicionArqueologo();
        destino = environmentState.getdestino();
        mundo = environmentState.getmundo();
        cofre = environmentState.getmundo().getCofre(posicion);
        
        this.setusarsatelite(UNKNOWN_PERCEPTION);
    	this.setvercofre(UNKNOWN_PERCEPTION);*/
    }
//percepcion [aldeaActual,esDestino,valorTesoro,pesoTesoro,aldeasVecinas,distanciasVecinas,valoresCofresVecinos,pesosCofresVecinos]
    @Override
    public String toString() {
        StringBuffer predicado = new StringBuffer("percepcion([");
        predicado.append(this.usarGPS());
        predicado.append(",");
        predicado.append(this.usarCamara());        
        predicado.append(",");
        predicado.append(this.usarSatelite());          
        predicado.append("])");
       
        //System.out.println("la percepcion es: "+predicado.toString());
        return predicado.toString();
    }
    
    private String usarGPS(){
    	String str="";
    	str=str+this.posicion+","+this.esDestino();
    	return str;
    }
	private String usarCamara(){
		String str1="";
		String str2="";
		
		str1=str1+this.cofre.getValor();
		str2=str2+this.cofre.getPeso();	
		
		return new String(str1+","+str2);
	}
    
    private String usarSatelite(){
    	int distancias[][]= mundo.getDistancias();
    	int indiceA = this.mundo.getNombres().indexOf(posicion);
    	
    	String str1="[";
		String str2="[";
		String str3="[";
		String str4="[";
		
		ArrayList<String> vecinos = new ArrayList<String>();
		vecinos.addAll(mundo.getVecinos(posicion));
		for(int j=0; j < vecinos.size();j++){
			int indiceB = this.mundo.getNombres().indexOf(vecinos.get(j));
			str1=str1+vecinos.get(j);
			str2=str2+distancias[indiceA][indiceB];
			str3=str3+mundo.getCofre(vecinos.get(j)).getValor();
			str4=str4+mundo.getCofre(vecinos.get(j)).getPeso();
			if(j < (vecinos.size()-1)){
				str1+=",";
				str2+=",";
				str3+=",";
				str4+=",";
			}		
		}
		str1+="]";
		str2+="]";
		str3+="]";
		str4+="]";

		return new String(str1+","+str2+","+str3+","+str4);
		
	}
    /**
     * Se fija si la posicion actual es el destino, o sino si el destino esta entre los vecinos.
     * @return
     */
    public int esDestino(){
    	ArrayList<String> vecinos = new ArrayList<String>();
		vecinos.addAll(mundo.getVecinos(posicion));
		if(posicion.equals(destino))
			return 1;
		for(int i=0;i<vecinos.size();i++){
			if(vecinos.get(i).equals(destino))
				return 1;
		}
		return 0;		
    }
    
	public String getPosicion() {
		return posicion;
	}
	public void setPosicion(String posicion) {
		this.posicion = posicion;
	}
	public String getDestino() {
		return destino;
	}
	public void setDestino(String destino) {
		this.destino = destino;
	}
	public Mundo getMundo() {
		return mundo;
	}
	public void setMundo(Mundo mundo) {
		this.mundo = mundo;
	}
	public Cofre getCofre() {
		return cofre;
	}
	public void setCofre(Cofre cofre) {
		this.cofre = cofre;
	}


}
